package com.sky.annotation;

import com.sky.enumeration.OperationType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 */
@Target(ElementType.METHOD)//该注解只能加到方法上
@Retention(RetentionPolicy.RUNTIME)//该注解在运行时生效，属于元注解三大枚举中的一种
/**
 * 元注解的三大枚举
 * RetentionPolicy枚举
 * @Retention元注解使用RetentionPolicy枚举来指定注解的保留策略，它决定了注解在什么阶段可用。RetentionPolicy包含以下三个枚举值：
 * SOURCE：注解仅保留在源文件中，在编译阶段被丢弃。编译器在编译时会忽略这类注解，不会将其存储在生成的字节码文件中。例如，一些用于辅助代码生成或在开发阶段进行标记的注解可能会使用SOURCE保留策略，如@Override注解，如果在编译时发现方法并非正确地重写了父类方法，编译器会报错，但在运行时并不需要这个注解的信息。
 * CLASS：这是默认的保留策略。注解会被保留在编译后的字节码文件中，但在运行时 JVM 不会加载该注解信息。大多数情况下，如果我们只是需要在编译时对代码进行一些检查或处理，而不需要在运行时访问注解信息，就可以使用CLASS保留策略。
 * RUNTIME：注解不仅被保留在字节码文件中，在运行时 JVM 也会加载该注解信息，程序可以通过反射机制在运行时获取注解的相关信息。例如，Spring 框架中的@Component、@Autowired等注解就是使用RUNTIME保留策略，以便在运行时进行依赖注入等操作。
 * ElementType枚举
 * @Target元注解使用ElementType枚举来指定注解可以应用的目标元素类型。ElementType包含多个枚举值，常见的有以下几个：
 * TYPE：表示注解可以应用于类、接口、枚举等类型上。例如，@Entity注解通常用于标记一个类是 JPA 中的实体类，它的目标元素就是TYPE。
 * METHOD：表示注解可以应用于方法上。比如@RequestMapping注解在 Spring MVC 中常被用于方法上，用来映射请求路径。
 * FIELD：表示注解可以应用于字段（成员变量）上。如@Autowired注解可以用于字段上，实现自动注入依赖的功能。
 */
public @interface AutoFill {
    OperationType value();
}
